package com.tuzhi.sys.scurity;

import com.tuzhi.base.redis.MyRedisTemplate;
import com.tuzhi.config.ConstantConfig;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * 权限缓存相关服务类，操作redis缓存中的数据
 */
@Service
public class AuthCacheService {

    /**
     * 缓存权限相关缓存设计：
     * 1.存放用户所拥有角色的redis key 前缀： tz_sys_auth:user_roles:     （用户ID 对应 放角色名集合）
     * 2.存放角色所拥有的权限标识的redis key前缀：tz_sys_auth:role_perms:   （角色名 对应 放角色名集合）
     * 3.存放角色所拥有的菜单Id的redis key前缀：tz_sys_auth:role_menus:
     * 4.存放角色所拥有的权限标识的redis key前缀：tz_sys_auth:role_urls:
     */
    @Autowired
    MyRedisTemplate redisCache;
    /**
     * 缓存时间，单位：秒，10800为3小时
     */
    static final Integer CACHE_TIME = 10800;

    /**
     * 从缓存中查找用户所拥有的角色
     *
     * @param userId
     * @return
     */
    public HashSet<String> findUserRoleNameCache(Long userId) {
        String key = ConstantConfig.AUTH_USER_ROLE_CACHE_KEY_PREFIX + userId;
        HashSet<String> roleIds = redisCache.getCacheObject(key);
        return roleIds;
    }

    /**
     * 删除用户所拥有的角色的缓存
     *
     * @param userId
     * @return
     */
    public boolean delUserRoleNameCache(Long userId) {
        String key = ConstantConfig.AUTH_USER_ROLE_CACHE_KEY_PREFIX + userId;
        return redisCache.del(key);
    }

    /**
     * 从缓存中查找角色所拥有的权限标识
     *
     * @param roleName
     * @return
     */
    public HashSet<String> findRolePermsCache(String roleName) {
        String key = ConstantConfig.AUTH_ROLE_PERM_CACHE_KEY_PREFIX + roleName;
        HashSet<String> perms = redisCache.getCacheObject(key);
        return perms;
    }

    /**
     * 删除 角色所拥有的权限标识 的缓存
     *
     * @param roleName
     * @return
     */
    public boolean delRolePermsCache(String roleName) {
        String key = ConstantConfig.AUTH_ROLE_PERM_CACHE_KEY_PREFIX + roleName;
        return redisCache.del(key);
    }

    /**
     * 从缓存中查找角色所拥有的url
     *
     * @param roleName
     * @return
     */
    public HashSet<String> findRoleUrlsCache(String roleName) {
        String key = ConstantConfig.AUTH_ROLE_URL_CACHE_KEY_PREFIX + roleName;
        HashSet<String> perms = redisCache.getCacheObject(key);
        return perms;
    }

    /**
     * 删除角色所拥有的url 的缓存
     *
     * @param roleName
     * @return
     */
    public boolean delRoleUrlsCache(String roleName) {
        String key = ConstantConfig.AUTH_ROLE_URL_CACHE_KEY_PREFIX + roleName;
        return redisCache.del(key);
    }

    /**
     * 从缓存中查找角色所拥有的菜单Id
     *
     * @param roleName
     * @return
     */
    public List<Long> findRoleMenuIdsCache(String roleName) {
        String key = ConstantConfig.AUTH_ROLE_MENU_CACHE_KEY_PREFIX + roleName;
        List<Long> menus = redisCache.getCacheObject(key);
        return menus;
    }

    /**
     * 删除角色所拥有的菜单Id 缓存
     *
     * @param roleName
     * @return
     */
    public boolean delMenuIdsCache(String roleName) {
        String key = ConstantConfig.AUTH_ROLE_MENU_CACHE_KEY_PREFIX + roleName;
        return redisCache.del(key);
    }

    /**
     * 设置用户的角色组缓存
     *
     * @param userId
     * @param roleIds
     */
    public void setUserRoles2Cache(Long userId, Collection<String> roleIds) {
        String key = ConstantConfig.AUTH_USER_ROLE_CACHE_KEY_PREFIX + userId;
        setCache4Collection(key, roleIds);
    }

    /**
     * 设置角色的权限标识缓存
     *
     * @param roleName
     * @param perms
     */
    public void setRolePerms2Cache(String roleName, Collection<String> perms) {
        String key = ConstantConfig.AUTH_ROLE_PERM_CACHE_KEY_PREFIX + roleName;
        setCache4Collection(key, perms);
    }

    /**
     * 设置角色的菜单Id缓存
     *
     * @param roleId
     * @param menus
     */
    public void setRoleMenus2Cache(Long roleId, Collection<Long> menus) {
        String key = ConstantConfig.AUTH_ROLE_MENU_CACHE_KEY_PREFIX + roleId;
        setCache4Collection(key, menus);
    }

    public void setCache4Collection(String key, Collection list) {
        if (CollectionUtils.isEmpty(list)) {
            redisCache.del(key);
        } else {
            if (!(list instanceof HashSet)) {
                list = new HashSet(list);
            }
            redisCache.setCacheObject(key, list, CACHE_TIME, TimeUnit.SECONDS);
        }
    }


    /**
     * 删除所有角色的权限标识缓存
     */
    public void deleteRolePermsCache() {
        Set<String> keys = redisCache.getKeys("tz_sys_auth:role_perms:*");
        for (String key : keys) {
            redisCache.del(key);
        }
    }

    /**
     * 删除所有角色的url缓存
     */
    public void deleteRoleUrlsCache() {
        Set<String> keys = redisCache.getKeys("tz_sys_auth:role_urls:*");
        for (String key : keys) {
            redisCache.del(key);
        }
    }


}
